--- title: "03-Windows 端口占用排查与释放" created: 2025-11-28 aliases: - Windows 端口占用排查与释放 tags: - 项目 --- # Windows 端口占用排查与释放 1. 查看所有端口占用情况 `netstat -ano` **作用:** - 查看本机所有 TCP、UDP 连接 - 查看监听端口、连接状态、PID 2. 查看指定端口是否被占用 示例:查询端口 **15672** `netstat -ano | findstr 15672` 输出字段说明(按列): | 字段 | 说明 | | --- | --- | | Proto | 协议(TCP/UDP) | | Local Address | 本地地址 + 端口 | | Foreign Address | 外部地址 + 端口 | | State | 连接状态(LISTENING、ESTABLISHED 等) | | PID | 占用端口的进程 ID | > 💡 例如显示: > `TCP 0.0.0.0:15672 ... LISTENING 48980` > 说明 **PID 为 48980 的进程占用了 15672 端口**。 3. 根据 PID 查找进程名称 `tasklist | findstr 48980` 示例输出: `erl.exe 48980 Services` 说明: - 占用端口的程序是 `erl.exe`(一般是 RabbitMQ 的后台运行服务) 4. 杀死进程(释放端口) 普通结束进程 `taskkill /PID 48980` 强制结束进程(带依赖子进程) `taskkill /PID 48980` 连同子进程全部强制杀掉 `taskkill /t /f /im erl.exe` > ⚠️ 注意 > /F = 强制 > /T = 连带子进程 > 需要管理员权限,否则可能失败。 5. 完整排查流程总结 | 步骤 | 命令 | 作用 | | --- | --- | --- | | ① | `netstat -ano | findstr 15672` | | ② | `tasklist | findstr ` | | ③ | `taskkill /PID /F` | 释放端口 | 6.常见状态解释 | 状态 | 含义 | | --- | --- | | LISTENING | 程序正在监听端口 | | ESTABLISHED | 已建立连接 | | TIME\_WAIT | 连接等待释放(正常现象) | | CLOSE\_WAIT | 对端关闭但本端未完全关闭(可能卡死) | ## 快速脚本 **killport.bat** ```dos @echo off :: -------------------------------------------- :: 强制使用 UTF-8 编码(避免脚本内部乱码) :: -------------------------------------------- chcp 65001 >nul :: -------------------------------------------- :: 检查是否传入端口号 :: -------------------------------------------- if "%1"=="" ( echo ❌ 错误:请使用 killport ^<端口号^> echo 示例:killport 8686 pause exit /b ) set port=%1 echo 🔍 正在查找占用端口 %port% 的进程... :: -------------------------------------------- :: 精准匹配端口,例如只匹配 ":8686 " :: 并去重 PID 存入临时文件 :: -------------------------------------------- netstat -ano | findstr /R /C:":%port% " > tmp_netstat.txt if %errorlevel% neq 0 ( echo ✅ 端口 %port% 当前没有被任何进程占用 del tmp_netstat.txt >nul 2>&1 pause exit /b ) :: 从结果中提取 PID(第 5 列),去重 for /f "tokens=5" %%i in (tmp_netstat.txt) do ( echo %%i >> tmp_pids.txt ) :: 去重(依赖 sort) sort tmp_pids.txt /unique > tmp_pids_sorted.txt del tmp_pids.txt >nul 2>&1 :: -------------------------------------------- :: 逐个杀死唯一 PID :: -------------------------------------------- echo ----------------------------------------- echo ⚙️ 发现以下 PID 占用了端口 %port%: type tmp_pids_sorted.txt echo ----------------------------------------- for /f %%i in (tmp_pids_sorted.txt) do ( echo 🔥 正在终止 PID %%i ... taskkill /PID %%i /F >nul 2>&1 if !errorlevel! equ 0 ( echo ✔️ 成功终止 PID %%i ) else ( echo ⚠️ PID %%i 无法终止(可能已退出) ) ) :: 清理临时文件 del tmp_netstat.txt >nul 2>&1 del tmp_pids_sorted.txt >nul 2>&1 echo ----------------------------------------- echo 🎉 完成:端口 %port% 已释放 pause exit /b ``` ### 想在任何目录下都能直接敲 `killport xx` 来关闭某个进程 1. 新建一个工具目录,例如:`D:\develop\dev-tools\bin` 2. 把 `killport.bat` 放进去 ![[image-68f6e4c1.png]] 3. 把这个目录加到环境变量 `PATH` 里 1. 右键“此电脑” → **属性** 2. 左侧或右边找到 **高级系统设置** 3. 下方点 **环境变量** 4. 在“用户变量”或“系统变量”中找到 `Path` → 选中 → **编辑** 5. 点击 **新建**,输入你的路径,例如: - `D:\develop\dev-tools\bin` ![[image-31d91416.png]] 4. 一路“确定”保存 5. 关闭所有已有的 cmd/PowerShell 窗口,重新打开一个新的 之后就可以在任意位置执行: `killport 8686` ![[killport-40988b41.gif]] --- **VibeCoding 导航**:⬅️ [[02-RabbitMQ 管理界面(15672)无法访问问题排查与解决|02-RabbitMQ 管理界面(15672)无法访问问题排查与解决]] | 03-Windows 端口占用排查与释放 | ➡️ [[05-红软先锋——码上校园|05-红软先锋——码上校园]]